package com.api.common.utils.VER.EnumVer;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Method;

public class EnumValidator implements ConstraintValidator<Enum, Object> {

    private Enum annotation;

    @Override
    public void initialize(Enum constraintAnnotation) {
        this.annotation = constraintAnnotation;
    }

    /**
     * 判断是否校验成功
     *
     * @param value 待校验的值
     * @return 校验结果
     */
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        // 如果待校验的值为null，是否校验通过
        if (value == null) {
            return annotation.allowNull();
        }
        // 返回枚举常量的数组：UP,DOWN
        Object[] objects = annotation.clazz().getEnumConstants();
        try {
            // 获取枚举类中获取校验字段的方法名
            Method method = annotation.clazz().getMethod(annotation.method());
            for (Object o : objects) {
                // 将方法执行的结果method.invoke(o)和待校验的值value进行比较，如果相同，说明校验成功
                if (value.equals(method.invoke(o))) {
                    return true;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 如果value没有在枚举值中，校验失败
        return false;
    }
}
